package com.azzaou.controller;

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.Serializable;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
import java.util.ListIterator;

import javax.faces.component.html.HtmlInputHidden;
import javax.faces.context.ExternalContext;
import javax.faces.context.FacesContext;
import javax.faces.model.SelectItem;
import javax.servlet.http.HttpServletRequest;

import org.apache.commons.lang.StringUtils;
import org.apache.myfaces.custom.fileupload.UploadedFile;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;


import com.azzaou.dao.ITransactionDao;
import com.azzaou.dao.impl.TransactionDao;
import com.azzaou.model.Associe;
import com.azzaou.model.BonTransactionChantier;
import com.azzaou.model.CategorieMarchandise;
import com.azzaou.model.Chantier;
import com.azzaou.model.Employe;
import com.azzaou.model.Fournisseur;
import com.azzaou.model.LigneTransactionChantier;
import com.azzaou.model.Marchandise;
import com.azzaou.service.IAssocieService;
import com.azzaou.service.IFournisseurService;
import com.azzaou.service.ITransactionService;
import com.azzaou.service.ITransactionService;
import com.azzaou.util.ErrorHandler;
import com.azzaou.util.ExportUtil;


public class TransactionController  implements Serializable {
	
	
	private static Fournisseur fournisseurCourant;
	private Fournisseur fournisseur;
	boolean delete = false;
	private ITransactionService transactionService;
	private IAssocieService associeService;
	private IFournisseurService fournisseurService;
	private ErrorHandler errorHandler;
	private List<BonTransactionChantier> listBonTransactions;
	private HtmlInputHidden addCount = new HtmlInputHidden();
	
	private ExternalContext context;
	private HttpServletRequest request;
	private UploadedFile uploadedFile;
	private BonTransactionChantier bonTransactionChantier;
	
	private List<LigneTransactionChantier> ligneTransactionChantiers ;
		
    private Long idTransaction;
    private Long idAssocie;
    private Long idFournisseur;
    private Long idMarchandise;
    private List<SelectItem> listAssocie;
    private List<SelectItem> listFournisseur;

	private LigneTransactionChantier ligneTransactionChantier;
	String action = "";
	
	
	
	
	public boolean isDelete() {
		return delete;
	}

	public void setDelete(boolean delete) {
		this.delete = delete;
	}

	public static Fournisseur getFournisseurCourant() {
		return fournisseurCourant;
	}

	public static void setFournisseurCourant(Fournisseur fournisseurCourant) {
		TransactionController.fournisseurCourant = fournisseurCourant;
	}

	public Fournisseur getFournisseur() {
		return fournisseur;
	}

	public void setFournisseur(Fournisseur fournisseur) {
		this.fournisseur = fournisseur;
	}

	
	public IFournisseurService getFournisseurService() {
		return fournisseurService;
	}

	public void setFournisseurService(IFournisseurService fournisseurService) {
		this.fournisseurService = fournisseurService;
	}

	public List<SelectItem> getListAssocie() {
		listAssocie =  new ArrayList<SelectItem>();
		for(Associe value :  associeService.getAllActifAssocie())
		{
			listAssocie.add(new SelectItem(value.getId(), value.getNomComplet()));
		}
		return listAssocie;
	}

	public List<SelectItem> getListFournisseur()
	{
		listFournisseur = new ArrayList<SelectItem>();
		for(Fournisseur value : fournisseurService.getAllActifFournisseur())
		{
			listFournisseur.add(new SelectItem(value.getId(), value.getNom()));
		}
		return listFournisseur;
	}
	
	public Long getIdFournisseur() {
		return idFournisseur;
	}



	public void setIdFournisseur(Long idFournisseur) {
		this.idFournisseur = idFournisseur;
	}

	public Long getIdMarchandise() {
		return idMarchandise;
	}

	public void setIdMarchandise(Long idMarchandise) {
		this.idMarchandise = idMarchandise;
	}

	public void setListAssocie(List<SelectItem> listAssocie) {
		this.listAssocie = listAssocie;
	}
    
	public void setListFournisseur (List<SelectItem> listFournisseur)
	{
		this.listFournisseur = listFournisseur;
	}
	
	public Long getIdAssocie() {
		return idAssocie;
	}


	public void setIdAssocie(Long idAssocie) {
		this.idAssocie = idAssocie;
	}


	public Long getIdTransaction() {
		return idTransaction;
	}


	public void setIdTransaction(Long idTransaction) {
		this.idTransaction = idTransaction;
	}


	public HtmlInputHidden getAddCount() {
		return addCount;
	}


	public void setAddCount(HtmlInputHidden addCount) {
		this.addCount = addCount;
	}


	public String filter() {
		listBonTransactions = transactionService.getTransactionByCriteria(bonTransactionChantier);
		action = "filter";
		return "";
	}

	
	public String saveOrUpdateTransaction() {
		
		context = FacesContext.getCurrentInstance().getExternalContext();
		request = (HttpServletRequest) context.getRequest();
		try {
		//	bonTransactionChantier.setAssocie(associeService.getAssocieById(idAssocie));
			
			transactionService.saveOrUpdate(bonTransactionChantier);
			listBonTransactions = transactionService.getAllActifTransaction(fournisseurCourant);
			action = "add";
			context.redirect(request.getContextPath() + "/pages/BonTransaction.jsf");
		} catch (IOException e) {
			e.printStackTrace();
		}
	//	bonTransactionChantier = new BonTransactionChantier();
		return "";
	}

	public void exportResults() {
		
	}

	public String goToAddTransaction() {
		bonTransactionChantier = new BonTransactionChantier();
		context = FacesContext.getCurrentInstance().getExternalContext();
		request = (HttpServletRequest) context.getRequest();
		listBonTransactions = transactionService.getAllTransactions();
		try {
			context.redirect(request.getContextPath() + "/pages/BonTransaction.jsf");
		} catch (IOException e) {
			e.printStackTrace();
		}
		return "";
	}

	public String goToUpdateTransaction() {
		context = FacesContext.getCurrentInstance().getExternalContext();
		request = (HttpServletRequest) context.getRequest();
		try {
			context.redirect(request.getContextPath() + "/pages/BonTransaction.jsf");
		} catch (IOException e) {
			e.printStackTrace();
		}
		return "";
	}

	public String retourAuTransaction() {
		context = FacesContext.getCurrentInstance().getExternalContext();
		request = (HttpServletRequest) context.getRequest();
		listBonTransactions = transactionService.getAllTransactions();
		fournisseurCourant = fournisseur;
		try {
			context.redirect(request.getContextPath() + "/pages/BonTransactions.jsf");
		} catch (IOException e) {
			e.printStackTrace();
		}
		bonTransactionChantier = new BonTransactionChantier();
		return "";
	}    
	
	public List<BonTransactionChantier> getListBonTransactions() {
		return listBonTransactions;
	}


	public void setListBonTransactions(
			List<BonTransactionChantier> listBonTransactions) {
		this.listBonTransactions = listBonTransactions;
	}


	public BonTransactionChantier getBonTransaction() {
		return bonTransactionChantier;
	}


	public void setBonTransaction(BonTransactionChantier bonTransaction) {
		this.bonTransactionChantier = bonTransaction;
	}


	public BonTransactionChantier getBonTransactionChantier() {
		return bonTransactionChantier;
	}


	public void setBonTransactionChantier(
			BonTransactionChantier bonTransactionChantier) {
		this.bonTransactionChantier = bonTransactionChantier;
	}





	public List<LigneTransactionChantier> getLigneTransactionChantiers() {
		if(ligneTransactionChantiers == null || ligneTransactionChantiers.isEmpty())
		{
			ligneTransactionChantiers = new ArrayList<>();
			 addCount.setValue(0);
		}
		return ligneTransactionChantiers;
	}


	public void setLigneTransactionChantiers(
			List<LigneTransactionChantier> ligneTransactionChantiers) {
		this.ligneTransactionChantiers = ligneTransactionChantiers;
	}


	public LigneTransactionChantier getLigneTransactionChantier() {
		return ligneTransactionChantier;
	}


	public void setLigneTransactionChantier(
			LigneTransactionChantier ligneTransactionChantier) {
		this.ligneTransactionChantier = ligneTransactionChantier;
	}


	public IAssocieService getAssocieService() {
		return associeService;
	}


	public void setAssocieService(IAssocieService associeService) {
		this.associeService = associeService;
	}


	public List<BonTransactionChantier> getListTransaction() {
		if (StringUtils.isBlank(action)) {
			listBonTransactions = transactionService.getAllActifTransaction(fournisseurCourant);
		}
		return listBonTransactions;
	}

	public void setListTransaction(List<BonTransactionChantier> listBonTransactions) {
		this.listBonTransactions = listBonTransactions;
	}

	public ErrorHandler getErrorHandler() {
		return errorHandler;
	}

	public void setErrorHandler(ErrorHandler errorHandler) {
		this.errorHandler = errorHandler;
	}

	public UploadedFile getUploadedFile() {
		return uploadedFile;
	}

	public void setUploadedFile(UploadedFile uploadedFile) {
		this.uploadedFile = uploadedFile;
	}

	public ITransactionService getTransactionService() {
		return transactionService;
	}

	public void setTransactionService(ITransactionService transactionService) {
		this.transactionService = transactionService;
	}

	public List<BonTransactionChantier> getListTransactions() {
		return listBonTransactions;
	}

	public void setListTransactions(List<BonTransactionChantier> listBonTransactions) {
		this.listBonTransactions = listBonTransactions;
	}

	 public String addNewligneTransaction() {

		 
	        // Add new MyData item to the data list.
		 ligneTransactionChantiers.add(new LigneTransactionChantier());
	        addCount.setValue(((Integer) addCount.getValue()) + 1);

	        return ""; // Postback to same view. You can declare method void as well.
	    }

	    public String saveNewligneTransactions() {

	        // Do your "UPDATE mydata SET values WHERE id" thing for each new data item.
	        try {
	            int size = ligneTransactionChantiers.size();
	            bonTransactionChantier.setChantier(ChantierController.getChantierEnCours());
	            
	            bonTransactionChantier.setFournisseur(fournisseurCourant);
	          
	            transactionService.saveOrUpdate(bonTransactionChantier);
	            for (LigneTransactionChantier ligne : ligneTransactionChantiers.subList(size - ((Integer) addCount.getValue()), size))
	            {
	            	ligne.setBonTransactionChantier(bonTransactionChantier);
	            	//ligne.setIdMarchandise(idMarchandise);
	            }
	            transactionService.save(ligneTransactionChantiers.subList(size - ((Integer) addCount.getValue()), size));
	           
	            
	            
	        } catch (Exception e) {
	           
	            e.printStackTrace();
	        }

	        // Reset the amount of newly added items.
	        addCount.setValue(0);

	        return "list"; // Navigation case.
	    } 	
	    
		public String deleteBon() {
			context = FacesContext.getCurrentInstance().getExternalContext();
			request = (HttpServletRequest) context.getRequest();
			try {
				transactionService.remove(bonTransactionChantier);
				listBonTransactions = transactionService.getAllActifTransaction(fournisseurCourant);
				action = "delete";
				context.redirect(request.getContextPath() + "/pages/BonTransactions.jsf");
			} catch (IOException e) {
				e.printStackTrace();
			}
			delete = false;
			bonTransactionChantier = new BonTransactionChantier();
			return "";
		}

}
